package com.uniflow.mapper;

import com.uniflow.entity.UserRole;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 用户角色关联数据访问层
 * 
 * @author luban
 * @since 1.0.0
 */
@Mapper
public interface UserRoleMapper {
    
    /**
     * 根据用户ID查询角色关联列表
     */
    List<UserRole> selectByUserId(@Param("userId") String userId);
    
    /**
     * 根据角色ID查询用户关联列表
     */
    List<UserRole> selectByRoleId(@Param("roleId") String roleId);
    
    /**
     * 根据用户ID和角色ID查询关联
     */
    UserRole selectByUserIdAndRoleId(@Param("userId") String userId, @Param("roleId") String roleId);
    
    /**
     * 检查用户是否有指定角色
     */
    boolean hasUserRole(@Param("userId") String userId, @Param("roleId") String roleId);
    
    /**
     * 查询用户的角色ID列表
     */
    List<String> selectRoleIdsByUserId(@Param("userId") String userId);
    
    /**
     * 查询角色的用户ID列表
     */
    List<String> selectUserIdsByRoleId(@Param("roleId") String roleId);
    
    /**
     * 查询所有用户角色关联
     */
    List<UserRole> selectAll();
    
    /**
     * 根据分配人查询关联列表
     */
    List<UserRole> selectByAssignedBy(@Param("assignedBy") String assignedBy);
    
    /**
     * 根据分配时间范围查询关联列表
     */
    List<UserRole> selectByAssignedTimeRange(@Param("startTime") LocalDateTime startTime, 
                                             @Param("endTime") LocalDateTime endTime);
    
    /**
     * 插入用户角色关联
     */
    int insert(UserRole userRole);
    
    /**
     * 批量插入用户角色关联
     */
    int insertBatch(@Param("userRoles") List<UserRole> userRoles);
    
    /**
     * 删除用户角色关联
     */
    int deleteByUserIdAndRoleId(@Param("userId") String userId, @Param("roleId") String roleId);
    
    /**
     * 根据用户ID删除所有角色关联
     */
    int deleteByUserId(@Param("userId") String userId);
    
    /**
     * 根据角色ID删除所有用户关联
     */
    int deleteByRoleId(@Param("roleId") String roleId);
    
    /**
     * 批量删除用户角色关联
     */
    int deleteBatch(@Param("userIds") List<String> userIds, @Param("roleIds") List<String> roleIds);
    
    /**
     * 更新分配信息
     */
    int updateAssignedInfo(@Param("userId") String userId, 
                          @Param("roleId") String roleId,
                          @Param("assignedBy") String assignedBy,
                          @Param("assignedByName") String assignedByName);
    
    /**
     * 查询用户角色关联总数
     */
    Long selectCount();
    
    /**
     * 查询指定用户的角色数量
     */
    Long selectUserRoleCount(@Param("userId") String userId);
    
    /**
     * 查询指定角色的用户数量
     */
    Long selectRoleUserCount(@Param("roleId") String roleId);
    
    /**
     * 查询角色分布统计
     */
    List<Map<String, Object>> selectRoleDistributionStats();
    
    /**
     * 查询用户角色统计
     */
    List<Map<String, Object>> selectUserRoleStats();
    
    /**
     * 查询最近分配的角色
     */
    List<UserRole> selectRecentAssigned(@Param("limit") Integer limit);
    
    /**
     * 查询指定时间段内的角色分配记录
     */
    List<UserRole> selectAssignedInPeriod(@Param("startTime") LocalDateTime startTime,
                                          @Param("endTime") LocalDateTime endTime);
    
    /**
     * 查询没有角色的用户列表
     */
    List<String> selectUsersWithoutRole();
    
    /**
     * 查询没有用户的角色列表
     */
    List<String> selectRolesWithoutUser();
    
    /**
     * 查询用户角色变更历史
     */
    List<Map<String, Object>> selectUserRoleHistory(@Param("userId") String userId);
    
    /**
     * 查询角色分配者统计
     */
    List<Map<String, Object>> selectAssignerStats();
    
    /**
     * 批量更新用户角色
     */
    int batchUpdateUserRoles(@Param("userId") String userId, 
                            @Param("roleIds") List<String> roleIds,
                            @Param("assignedBy") String assignedBy,
                            @Param("assignedByName") String assignedByName);
    
    /**
     * 检查角色分配冲突
     */
    List<Map<String, Object>> checkRoleConflicts(@Param("userId") String userId, 
                                                 @Param("roleIds") List<String> roleIds);
}